์๋ฐ ๊ฐ์ ๋จธ์ (JVM) ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋์ ๋ํ ์ด ์ข ํฉ ๊ฐ์ด๋๋ฅผ ํตํด ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ๋ฆฌ์์ค ํ์ฉ์ ์ต์ ํํ์ธ์. ๋ค์ํ ๊ฐ๋น์ง ์ปฌ๋ ํฐ, ํ๋ ๋งค๊ฐ๋ณ์, ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์์๋ณด์ธ์.
์๋ฐ ๊ฐ์ ๋จธ์ : ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋ ์ฌ์ธต ๋ถ์
์๋ฐ์ ํ์ ์๋ฐ ๊ฐ์ ๋จธ์ (JVM)์ ํตํด ๋ฌ์ฑ๋๋ ํ๋ซํผ ๋ ๋ฆฝ์ฑ์ ์์ต๋๋ค. JVM์ ํต์ฌ์ ์ธ ์ธก๋ฉด์ ์ฃผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)์ ์ํด ์ฒ๋ฆฌ๋๋ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋๋ค. GC๋ฅผ ์ดํดํ๊ณ ํ๋ํ๋ ๊ฒ์ ํนํ ๋ค์ํ ์ํฌ๋ก๋์ ๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ์ฑ๋ฅ์ ์ํด ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋๋ ๋ค์ํ ๊ฐ๋น์ง ์ปฌ๋ ํฐ, ํ๋ ๋งค๊ฐ๋ณ์, ๊ทธ๋ฆฌ๊ณ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ต์ ํ์ ๋์์ด ๋ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ํฌํจํ GC ํ๋์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋ฐ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ดํดํ๊ธฐ
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํ๋ก๊ทธ๋จ์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๊ฐ ์ฐจ์งํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํ์ํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ๊ฐ๋ฐ์๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์์ ๋ฒ์ด๋๊ฒ ํ์ฌ ๊ฐ๋ฐ์ ๋จ์ํ์์ผ์ฃผ๋ฉฐ, ์ด๋ C๋ C++ ๊ฐ์ ์ธ์ด์ ๋นํด ์๋นํ ์ด์ ์ ๋๋ค. JVM์ GC๋ ์ด๋ฌํ ๋ฏธ์ฌ์ฉ ๊ฐ์ฒด๋ฅผ ์๋ณํ๊ณ ์ ๊ฑฐํ์ฌ ํฅํ ๊ฐ์ฒด ์์ฑ์ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ ํ๊ณผ ๊ทธ ํ๋ ๋งค๊ฐ๋ณ์๋ ๋ค์์ ํฌํจํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ง๋ํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค:
- ์ ํ๋ฆฌ์ผ์ด์ ์ค๋จ: GC ์ค๋จ์ 'stop-the-world' ์ด๋ฒคํธ๋ผ๊ณ ๋ ํ๋ฉฐ, GC๊ฐ ์คํ๋๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ค๋ ๋๊ฐ ์ผ์ ์ค๋จ๋ฉ๋๋ค. ์ฆ๊ฑฐ๋ ๊ธด ์ค๋จ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ์ฒ๋ฆฌ๋: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ์๋์ ๋๋ค. GC๋ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ฌ์ฉ๋ ์ ์๋ CPU ๋ฆฌ์์ค์ ์ผ๋ถ๋ฅผ ์๋นํ์ฌ ์ฒ๋ฆฌ๋์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ์ฉ๋: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ผ๋ง๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋์ง์ ๋๋ค. ์๋ชป ๊ตฌ์ฑ๋ GC๋ ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๊ณผ ์ฌ์ง์ด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ง์ฐ ์๊ฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ฒญ์ ์๋ตํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค. GC ์ค๋จ์ ์ง์ฐ ์๊ฐ์ ์ง์ ์ ์ธ ์์ธ์ด ๋ฉ๋๋ค.
JVM์ ๋ค์ํ ๊ฐ๋น์ง ์ปฌ๋ ํฐ
JVM์ ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์๋ ๋ค์ํ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ๊ณผ ์ํฌ๋ก๋ ํน์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ฃผ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๋ช ๊ฐ์ง๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
1. ์ง๋ ฌ ๊ฐ๋น์ง ์ปฌ๋ ํฐ
์ง๋ ฌ GC๋ ๋จ์ผ ์ค๋ ๋๋ก ์๋ํ๋ ์ปฌ๋ ํฐ๋ก, ์ฃผ๋ก ๋จ์ผ ์ฝ์ด ๋จธ์ ์ด๋ ํ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค. ๊ฐ์ฅ ๋จ์ํ ์ปฌ๋ ํฐ์ด๋ฉฐ ์ ์ฒด GC ์ฌ์ดํด์ ์ํํฉ๋๋ค. ์ฃผ์ ๋จ์ ์ ๊ธด 'stop-the-world' ์ค๋จ ์๊ฐ์ผ๋ก, ๋ฎ์ ์ง์ฐ ์๊ฐ์ด ์๊ตฌ๋๋ ์ด์ ํ๊ฒฝ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
2. ๋ณ๋ ฌ ๊ฐ๋น์ง ์ปฌ๋ ํฐ (์ฒ๋ฆฌ๋ ์ปฌ๋ ํฐ)
์ฒ๋ฆฌ๋ ์ปฌ๋ ํฐ๋ผ๊ณ ๋ ์๋ ค์ง ๋ณ๋ ฌ GC๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฒ๋ฆฌ๋์ ๊ทน๋ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ด๋ ๋ฐ ๋ฉ์ด์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ์ฌ ๊ฐ๋ณ GC ์ฌ์ดํด์ ์ง์ ์๊ฐ์ ์ค์ ๋๋ค. ๋ฐฐ์น ์ฒ๋ฆฌ ์์ ๊ณผ ๊ฐ์ด ๋ฎ์ ์ง์ฐ ์๊ฐ๋ณด๋ค ์ฒ๋ฆฌ๋ ๊ทน๋ํ๊ฐ ๋ ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข์ ์ ํ์ ๋๋ค.
3. CMS (๋์ ๋งํฌ ์ค์) ๊ฐ๋น์ง ์ปฌ๋ ํฐ (์ฌ์ฉ ์ค๋จ๋จ)
CMS๋ ๋๋ถ๋ถ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ค๋ ๋์ ๋์์ ์ํํ์ฌ ์ค๋จ ์๊ฐ์ ์ค์ด๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋์ ๋งํฌ-์ค์ ๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค. CMS๋ ๋ณ๋ ฌ GC๋ณด๋ค ๋ฎ์ ์ค๋จ ์๊ฐ์ ์ ๊ณตํ์ง๋ง, ๋จํธํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ณ CPU ์ค๋ฒํค๋๊ฐ ๋ ๋์์ต๋๋ค. CMS๋ ์๋ฐ 9๋ถํฐ ์ฌ์ฉ ์ค๋จ๋์์ผ๋ฉฐ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ ์ด์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. G1GC๋ก ๋์ฒด๋์์ต๋๋ค.
4. G1GC (Garbage-First) ๊ฐ๋น์ง ์ปฌ๋ ํฐ
G1GC๋ ์๋ฐ 9๋ถํฐ ๊ธฐ๋ณธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ด๋ฉฐ, ํฐ ํ ํฌ๊ธฐ์ ์งง์ ์ค๋จ ์๊ฐ ๋ชจ๋๋ฅผ ์ํด ์ค๊ณ๋์์ต๋๋ค. ํ์ ์ฌ๋ฌ ์์ญ(region)์ผ๋ก ๋๋๊ณ ๊ฐ๋น์ง๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฐฌ ์์ญ๋ถํฐ ์์งํ๋ ์ฐ์ ์์๋ฅผ ์ ํ๋ฏ๋ก 'Garbage-First'๋ผ๋ ์ด๋ฆ์ด ๋ถ์์ต๋๋ค. G1GC๋ ์ฒ๋ฆฌ๋๊ณผ ์ง์ฐ ์๊ฐ ์ฌ์ด์ ์ข์ ๊ท ํ์ ์ ๊ณตํ์ฌ ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ฉ๋๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ง์ ๋ ๋ชฉํ(์: 200๋ฐ๋ฆฌ์ด) ์ดํ๋ก ์ค๋จ ์๊ฐ์ ์ ์งํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
5. ZGC (Z ๊ฐ๋น์ง ์ปฌ๋ ํฐ)
ZGC๋ ์๋ฐ 11์ ๋์ ๋ ์ ์ง์ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๋๋ค(์๋ฐ 11์์๋ ์คํ์ ๊ธฐ๋ฅ, ์๋ฐ 15๋ถํฐ ์ ์ ์ง์). ํ ํฌ๊ธฐ์ ์๊ด์์ด GC ์ค๋จ ์๊ฐ์ 10๋ฐ๋ฆฌ์ด ์ดํ๋ก ์ต์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ZGC๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฑฐ์ ์ค๋จ ์์ด ์คํ๋๋๋ก ๋์์ ์๋ํฉ๋๋ค. ๊ณ ๋น๋ ๊ฑฐ๋ ์์คํ ์ด๋ ์จ๋ผ์ธ ๊ฒ์ ํ๋ซํผ๊ณผ ๊ฐ์ด ๊ทน๋๋ก ๋ฎ์ ์ง์ฐ ์๊ฐ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค. ZGC๋ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ์ปฌ๋ฌ ํฌ์ธํฐ(colored pointers)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
6. Shenandoah ๊ฐ๋น์ง ์ปฌ๋ ํฐ
Shenandoah๋ Red Hat์์ ๊ฐ๋ฐํ ์งง์ ์ค๋จ ์๊ฐ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ก ZGC์ ์ ์ฌ์ ์ธ ๋์์ ๋๋ค. ์ด ๋ํ ๋์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ์ฌ ๋งค์ฐ ์งง์ ์ค๋จ ์๊ฐ์ ๋ชฉํ๋ก ํฉ๋๋ค. Shenandoah์ ์ฃผ์ ์ฐจ๋ณ์ ์ ํ์ ๋์์ ์์ถํ ์ ์๋ค๋ ๊ฒ์ผ๋ก, ์ด๋ ๋จํธํ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. Shenandoah๋ OpenJDK ๋ฐ Red Hat ๋ฐฐํฌํ ์๋ฐ์์ ์ ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์งง์ ์ค๋จ ์๊ฐ๊ณผ ์ฒ๋ฆฌ๋ ํน์ฑ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค. Shenandoah๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์์ ํ ๋์์ ์๋ํ์ฌ ์ด๋ ์์ ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ๋ฉ์ถ์ง ์๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ์์ ์ ์ถ๊ฐ ์ค๋ ๋๋ฅผ ํตํด ์ํ๋ฉ๋๋ค.
์ฃผ์ GC ํ๋ ๋งค๊ฐ๋ณ์
๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๋ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๋ช ํ์ฑ์ ์ํด ๋ถ๋ฅ๋ ๋ช ๊ฐ์ง ์ค์ํ ๋งค๊ฐ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ํ ํฌ๊ธฐ ๊ตฌ์ฑ
-Xms(์ต์ ํ ํฌ๊ธฐ): ์ด๊ธฐ ํ ํฌ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค. ๋ฐํ์ ์ค์ JVM์ด ํ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด ๊ฐ์-Xmx์ ๋์ผํ๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.-Xmx(์ต๋ ํ ํฌ๊ธฐ): ์ต๋ ํ ํฌ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค. ์ด๋ ๊ตฌ์ฑํด์ผ ํ ๊ฐ์ฅ ์ค์ํ ๋งค๊ฐ๋ณ์์ ๋๋ค. ์ ์ ํ ๊ฐ์ ์ฐพ๋ ๋ฐ๋ ์คํ๊ณผ ๋ชจ๋ํฐ๋ง์ด ํ์ํฉ๋๋ค. ๋ ํฐ ํ์ ์ฒ๋ฆฌ๋์ ํฅ์์ํฌ ์ ์์ง๋ง GC๊ฐ ๋ ๋ง์ ์์ ์ ํด์ผ ํ ๊ฒฝ์ฐ ์ค๋จ ์๊ฐ์ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.-Xmn(Young Generation ํฌ๊ธฐ): Young Generation์ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค. Young Generation์ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์ด๊ธฐ์ ํ ๋น๋๋ ๊ณณ์ ๋๋ค. ๋ ํฐ Young Generation์ ๋ง์ด๋ GC์ ๋น๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. G1GC์ ๊ฒฝ์ฐ, Young Generation ํฌ๊ธฐ๋ ์๋์ผ๋ก ๊ด๋ฆฌ๋์ง๋ง-XX:G1NewSizePercent์-XX:G1MaxNewSizePercent๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ์ ํ ์ ์์ต๋๋ค.
2. ๊ฐ๋น์ง ์ปฌ๋ ํฐ ์ ํ
-XX:+UseSerialGC: ์ง๋ ฌ GC๋ฅผ ํ์ฑํํฉ๋๋ค.-XX:+UseParallelGC: ๋ณ๋ ฌ GC(์ฒ๋ฆฌ๋ ์ปฌ๋ ํฐ)๋ฅผ ํ์ฑํํฉ๋๋ค.-XX:+UseG1GC: G1GC๋ฅผ ํ์ฑํํฉ๋๋ค. ์ด๋ ์๋ฐ 9 ์ด์์์ ๊ธฐ๋ณธ๊ฐ์ ๋๋ค.-XX:+UseZGC: ZGC๋ฅผ ํ์ฑํํฉ๋๋ค.-XX:+UseShenandoahGC: Shenandoah GC๋ฅผ ํ์ฑํํฉ๋๋ค.
3. G1GC ๊ด๋ จ ๋งค๊ฐ๋ณ์
-XX:MaxGCPauseMillis=: G1GC์ ๋ชฉํ ์ต๋ ์ค๋จ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ค์ ํฉ๋๋ค. GC๋ ์ด ๋ชฉํ๋ฅผ ๋ง์ถ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ๋ณด์ฅ๋์ง๋ ์์ต๋๋ค.-XX:G1HeapRegionSize=: G1GC์ ํ ๋ด ์์ญ(region) ํฌ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค. ์์ญ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ฉด ์ ์ฌ์ ์ผ๋ก GC ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.-XX:G1NewSizePercent=: G1GC์์ Young Generation์ ์ฌ์ฉ๋ ํ์ ์ต์ ๋น์จ์ ์ค์ ํฉ๋๋ค.-XX:G1MaxNewSizePercent=: G1GC์์ Young Generation์ ์ฌ์ฉ๋ ํ์ ์ต๋ ๋น์จ์ ์ค์ ํฉ๋๋ค.-XX:G1ReservePercent=: ์๋ก์ด ๊ฐ์ฒด ํ ๋น์ ์ํด ์์ฝ๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 10%์ ๋๋ค.-XX:G1MixedGCCountTarget=: ํ ์ฌ์ดํด ๋ด ํผํฉ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ชฉํ ํ์๋ฅผ ์ง์ ํฉ๋๋ค.
4. ZGC ๊ด๋ จ ๋งค๊ฐ๋ณ์
-XX:ZUncommitDelay=: ZGC๊ฐ ์ด์ ์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ๋๊ธฐํ ์๊ฐ(์ด)์ ๋๋ค.-XX:ZAllocationSpikeFactor=: ํ ๋น๋ฅ ์ ์คํ์ดํฌ ๊ณ์์ ๋๋ค. ๊ฐ์ด ๋์์๋ก GC๊ฐ ๊ฐ๋น์ง๋ฅผ ์์งํ๊ธฐ ์ํด ๋ ์ ๊ทน์ ์ผ๋ก ์๋ํ๋๋ก ํ์ฉ๋๋ฉฐ ๋ ๋ง์ CPU ์ฌ์ดํด์ ์๋นํ ์ ์์ต๋๋ค.
5. ๊ธฐํ ์ค์ ๋งค๊ฐ๋ณ์
-XX:+PrintGCDetails: GC ์ฌ์ดํด, ์ค๋จ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ํ ๊ท์คํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์์ธ GC ๋ก๊น ์ ํ์ฑํํฉ๋๋ค. ์ด๋ GC ๋์์ ๋ถ์ํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.-XX:+PrintGCTimeStamps: GC ๋ก๊ทธ ์ถ๋ ฅ์ ํ์์คํฌํ๋ฅผ ํฌํจํฉ๋๋ค.-XX:+UseStringDeduplication(์๋ฐ 8u20 ์ด์, G1GC): ํ์์ ๋์ผํ ๋ฌธ์์ด์ ์ค๋ณต ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ ๋๋ค.-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses: ํ์ฌ JDK์์ ๋ช ์์ GC ํธ์ถ ์ฌ์ฉ์ ํ์ฑํ ๋๋ ๋นํ์ฑํํฉ๋๋ค. ์ด๋ ์ด์ ํ๊ฒฝ์์ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.-XX:+HeapDumpOnOutOfMemoryError: OutOfMemoryError๊ฐ ๋ฐ์ํ์ ๋ ํ ๋คํ๋ฅผ ์์ฑํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์์ธํ ๋ถ์ํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ณํ ์ ์๊ฒ ํฉ๋๋ค.-XX:HeapDumpPath=: ํ ๋คํ ํ์ผ์ด ๊ธฐ๋ก๋ ์์น๋ฅผ ์ง์ ํฉ๋๋ค.
์ค์ฉ์ ์ธ GC ํ๋ ์์
๋ค์ํ ์๋๋ฆฌ์ค์ ๋ํ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด๊ฒ๋ค์ ์์์ ์ด๋ฉฐ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ฑ์ ๋ฐ๋ผ ์คํ๊ณผ ๋ชจ๋ํฐ๋ง์ด ํ์ํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ญ์์ค. ์ ์ ํ ๊ธฐ์ค์ ์ ๊ฐ์ง๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ํ ๊ฒฐ๊ณผ๋ ํ๋์จ์ด์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
1. ๋ฐฐ์น ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ (์ฒ๋ฆฌ๋ ์ค์ฌ)
๋ฐฐ์น ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ฃผ๋ ๋ชฉํ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ ๊ทน๋ํํ๋ ๊ฒ์ ๋๋ค. ๋ฎ์ ์ง์ฐ ์๊ฐ์ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค. ๋ณ๋ ฌ GC๊ฐ ์ข ์ข ์ข์ ์ ํ์ ๋๋ค.
java -Xms4g -Xmx4g -XX:+UseParallelGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar mybatchapp.jar
์ด ์์ ์์๋ ์ต์ ๋ฐ ์ต๋ ํ ํฌ๊ธฐ๋ฅผ 4GB๋ก ์ค์ ํ๊ณ , ๋ณ๋ ฌ GC๋ฅผ ํ์ฑํํ๋ฉฐ, ์์ธ GC ๋ก๊น ์ ํ์ฑํํ์ต๋๋ค.
2. ์น ์ ํ๋ฆฌ์ผ์ด์ (์ง์ฐ ์๊ฐ ๋ฏผ๊ฐ)
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํด ๋ฎ์ ์ง์ฐ ์๊ฐ์ด ์ค์ํฉ๋๋ค. G1GC ๋๋ ZGC(๋๋ Shenandoah)๊ฐ ์ข ์ข ์ ํธ๋ฉ๋๋ค.
G1GC ์ฌ์ฉ:
java -Xms8g -Xmx8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar mywebapp.jar
์ด ๊ตฌ์ฑ์ ์ต์ ๋ฐ ์ต๋ ํ ํฌ๊ธฐ๋ฅผ 8GB๋ก ์ค์ ํ๊ณ , G1GC๋ฅผ ํ์ฑํํ๋ฉฐ, ๋ชฉํ ์ต๋ ์ค๋จ ์๊ฐ์ 200๋ฐ๋ฆฌ์ด๋ก ์ค์ ํฉ๋๋ค. ์ฑ๋ฅ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ MaxGCPauseMillis ๊ฐ์ ์กฐ์ ํ์ญ์์ค.
ZGC ์ฌ์ฉ (์๋ฐ 11+ ํ์):
java -Xms8g -Xmx8g -XX:+UseZGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar mywebapp.jar
์ด ์์ ๋ ์ ์ฌํ ํ ๊ตฌ์ฑ์ผ๋ก ZGC๋ฅผ ํ์ฑํํฉ๋๋ค. ZGC๋ ๋งค์ฐ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ์ํด ์ค๊ณ๋์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ค๋จ ์๊ฐ ๋ชฉํ๋ฅผ ๊ตฌ์ฑํ ํ์๊ฐ ์์ต๋๋ค. ํน์ ์๋๋ฆฌ์ค์ ๋ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ ๋น๋ฅ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ -XX:ZAllocationSpikeFactor=2๋ฅผ ์๋ํด ๋ณผ ์ ์์ต๋๋ค.
3. ๊ณ ๋น๋ ๊ฑฐ๋ ์์คํ (๊ทน๋๋ก ๋ฎ์ ์ง์ฐ ์๊ฐ)
๊ณ ๋น๋ ๊ฑฐ๋ ์์คํ ์ ๊ฒฝ์ฐ, ๊ทน๋๋ก ๋ฎ์ ์ง์ฐ ์๊ฐ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ํธํ๋๋ค๊ณ ๊ฐ์ ํ ๋ ZGC๊ฐ ์ด์์ ์ธ ์ ํ์ ๋๋ค. ์๋ฐ 8์ ์ฌ์ฉํ๊ฑฐ๋ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ Shenandoah๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
java -Xms16g -Xmx16g -XX:+UseZGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar mytradingapp.jar
์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ ์ฌํ๊ฒ ํ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๊ณ ZGC๋ฅผ ํ์ฑํํฉ๋๋ค. ์ํฌ๋ก๋์ ๋ฐ๋ผ ZGC ๊ด๋ จ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐ๋ก ํ๋ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
4. ๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์
๋งค์ฐ ํฐ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ ์คํ ๊ณ ๋ ค๊ฐ ํ์ํฉ๋๋ค. ๋ ํฐ ํ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํด์ผ ํ ์ ์์ผ๋ฉฐ ๋ชจ๋ํฐ๋ง์ด ๋์ฑ ์ค์ํด์ง๋๋ค. ๋ฐ์ดํฐ ์ธํธ๊ฐ ์๊ณ ๊ทธ ํฌ๊ธฐ๊ฐ Young Generation์ ๊ฐ๊น์ฐ๋ฉด ๋ฐ์ดํฐ๊ฐ Young Generation์ ์บ์๋ ์๋ ์์ต๋๋ค.
๋ค์ ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค:
- ๊ฐ์ฒด ํ ๋น๋ฅ : ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ช ์ด ์งง์ ๊ฐ์ฒด๋ฅผ ๋ง์ด ์์ฑํ๋ ๊ฒฝ์ฐ, Young Generation์ผ๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด ์๋ช : ๊ฐ์ฒด๊ฐ ๋ ์ค๋ ์ด์๋จ๋ ๊ฒฝํฅ์ด ์๋ค๋ฉด, Young Generation์์ Old Generation์ผ๋ก์ ์น๊ฒฉ๋ฅ ์ ๋ชจ๋ํฐ๋งํด์ผ ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ ์ ๊ณต๊ฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋์ด๊ณ OutOfMemoryError ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ฑฐ๋ ์๋ช ์ ์งง๊ฒ ๋ง๋ค๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฝ์ฐ, Young Generation๊ณผ Old Generation์ ๋น์จ์ด ์ค์ํฉ๋๋ค. ๋ฎ์ ์ค๋จ ์๊ฐ์ ๋ฌ์ฑํ๊ธฐ ์ํด ๋ค์ ์์ ๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
java -Xms32g -Xmx32g -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1NewSizePercent=20 -XX:G1MaxNewSizePercent=30 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar mydatasetapp.jar
์ด ์์ ๋ ๋ ํฐ ํ(32GB)์ ์ค์ ํ๊ณ , ๋ ๋ฎ์ ๋ชฉํ ์ค๋จ ์๊ฐ๊ณผ ์กฐ์ ๋ Young Generation ํฌ๊ธฐ๋ก G1GC๋ฅผ ๋ฏธ์ธ ์กฐ์ ํฉ๋๋ค. ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ ํ ์กฐ์ ํ์ญ์์ค.
๋ชจ๋ํฐ๋ง ๋ฐ ๋ถ์
GC ํ๋์ ํ ๋ฒ์ ๋๋๋ ์์ ์ด ์๋๋ผ ์ ์คํ ๋ชจ๋ํฐ๋ง๊ณผ ๋ถ์์ด ํ์ํ ๋ฐ๋ณต์ ์ธ ํ๋ก์ธ์ค์ ๋๋ค. ๋ชจ๋ํฐ๋ง์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. GC ๋ก๊น
-XX:+PrintGCDetails, -XX:+PrintGCTimeStamps, -Xloggc:๊ณผ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ GC ๋ก๊น
์ ํ์ฑํํ์ญ์์ค. ๋ก๊ทธ ํ์ผ์ ๋ถ์ํ์ฌ ์ค๋จ ์๊ฐ, GC ์ฌ์ดํด ๋น๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด์ ํฌํจํ GC ๋์์ ์ดํดํ์ญ์์ค. GC ๋ก๊ทธ๋ฅผ ์๊ฐํํ๊ณ ๋ถ์ํ๊ธฐ ์ํด GCViewer๋ GCeasy์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
2. ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง(APM) ๋๊ตฌ
APM ๋๊ตฌ(์: Datadog, New Relic, AppDynamics)๋ฅผ ํ์ฉํ์ฌ CPU ์ฌ์ฉ๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ์๋ต ์๊ฐ ๋ฐ ์ค๋ฅ์จ์ ํฌํจํ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ญ์์ค. ์ด๋ฌํ ๋๊ตฌ๋ GC์ ๊ด๋ จ๋ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋์์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. Prometheus ๋ฐ Grafana์ ๊ฐ์ ์์ฅ์ ๋๊ตฌ๋ ์ค์๊ฐ ์ฑ๋ฅ ํต์ฐฐ๋ ฅ์ ๋ณด๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3. ํ ๋คํ
OutOfMemoryError๊ฐ ๋ฐ์ํ ๋ ํ ๋คํ๋ฅผ ์์ฑํ์ญ์์ค(-XX:+HeapDumpOnOutOfMemoryError ๋ฐ -XX:HeapDumpPath= ์ฌ์ฉ). Eclipse MAT (Memory Analyzer Tool)์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋คํ๋ฅผ ๋ถ์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ณํ๊ณ ๊ฐ์ฒด ํ ๋น ํจํด์ ์ดํดํ์ญ์์ค. ํ ๋คํ๋ ํน์ ์์ ์ ์ ํ๋ฆฌ์ผ์ด์
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ค๋
์ท์ ์ ๊ณตํฉ๋๋ค.
4. ํ๋กํ์ผ๋ง
์๋ฐ ํ๋กํ์ผ๋ง ๋๊ตฌ(์: JProfiler, YourKit)๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค. ์ด๋ฌํ ๋๊ตฌ๋ ๊ฐ์ฒด ์์ฑ, ๋ฉ์๋ ํธ์ถ ๋ฐ CPU ์ฌ์ฉ๋์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์ต์ ํํจ์ผ๋ก์จ ๊ฐ์ ์ ์ผ๋ก GC ํ๋์ ๋์์ ์ค ์ ์์ต๋๋ค.
GC ํ๋์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์์ํ๊ธฐ: JVM ๊ธฐ๋ณธ๊ฐ์ ์ข ์ข ์ข์ ์ถ๋ฐ์ ์ ๋๋ค. ์ฃ๋ถ๋ฆฌ ๊ณผ๋ํ๊ฒ ํ๋ํ์ง ๋ง์ธ์.
- ์ ํ๋ฆฌ์ผ์ด์ ์ดํดํ๊ธฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํฌ๋ก๋, ๊ฐ์ฒด ํ ๋น ํจํด, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํน์ฑ์ ํ์ ํ์ญ์์ค.
- ์ด์ ํ๊ฒฝ๊ณผ ์ ์ฌํ ํ๊ฒฝ์์ ํ ์คํธํ๊ธฐ: ์ฑ๋ฅ ์ํฅ์ ์ ํํ๊ฒ ํ๊ฐํ๊ธฐ ์ํด ์ด์ ํ๊ฒฝ๊ณผ ๋งค์ฐ ์ ์ฌํ ํ๊ฒฝ์์ GC ๊ตฌ์ฑ์ ํ ์คํธํ์ญ์์ค.
- ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ธฐ: GC ๋์๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ญ์์ค. ๊ด์ฐฐ๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํ์์ ๋ฐ๋ผ ํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์กฐ์ ํ์ญ์์ค.
- ๋ณ์ ๊ฒฉ๋ฆฌํ๊ธฐ: ํ๋ํ ๋ ๊ฐ ๋ณ๊ฒฝ์ ์ํฅ์ ์ดํดํ๊ธฐ ์ํด ํ ๋ฒ์ ํ๋์ ๋งค๊ฐ๋ณ์๋ง ๋ณ๊ฒฝํ์ญ์์ค.
- ์ฃ๋ถ๋ฅธ ์ต์ ํ ํผํ๊ธฐ: ํ์คํ ๋ฐ์ดํฐ์ ๋ถ์ ์์ด ์ธ์ง๋ ๋ฌธ์ ์ ๋ํด ์ต์ ํํ์ง ๋ง์ญ์์ค.
- ์ฝ๋ ์ต์ ํ ๊ณ ๋ คํ๊ธฐ: ๊ฐ์ฒด ์์ฑ ๋ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ต์ ํํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ์ญ์์ค.
- ์ต์ ์ ๋ณด ์ ์งํ๊ธฐ: GC ๊ธฐ์ ๋ฐ JVM ์ ๋ฐ์ดํธ์ ์ต์ ๋ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํ์ญ์์ค. ์๋ก์ด JVM ๋ฒ์ ์๋ ์ข ์ข ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ฐ์ ์ฌํญ์ด ํฌํจ๋ฉ๋๋ค.
- ํ๋ ๋ด์ฉ ๋ฌธ์ํํ๊ธฐ: GC ๊ตฌ์ฑ, ์ ํ์ ๊ทผ๊ฑฐ, ์ฑ๋ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์ํํ์ญ์์ค. ์ด๋ ํฅํ ์ ์ง ๋ณด์ ๋ฐ ๋ฌธ์ ํด๊ฒฐ์ ๋์์ด ๋ฉ๋๋ค.
๊ฒฐ๋ก
๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ์ต์ ํ์ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. ๋ค์ํ ๊ฐ๋น์ง ์ปฌ๋ ํฐ, ํ๋ ๋งค๊ฐ๋ณ์ ๋ฐ ๋ชจ๋ํฐ๋ง ๊ธฐ์ ์ ์ดํดํจ์ผ๋ก์จ ํน์ ์ฑ๋ฅ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ๊ณผ์ ์ผ๋ก ์ต์ ํํ ์ ์์ต๋๋ค. GC ํ๋์ ๋ฐ๋ณต์ ์ธ ํ๋ก์ธ์ค์ด๋ฉฐ ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด์๋ ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง๊ณผ ๋ถ์์ด ํ์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์์ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ดํดํ๋ฉฐ, ํ์์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ์ฐพ๊ธฐ ์ํด ๋ค์ํ ๊ตฌ์ฑ์ ์คํํ์ญ์์ค. ์ฌ๋ฐ๋ฅธ ๊ตฌ์ฑ๊ณผ ๋ชจ๋ํฐ๋ง์ ํตํด ๊ธ๋ก๋ฒ ์๋น์ค ๋ฒ์์ ๊ด๊ณ์์ด ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํจ์จ์ ์ด๊ณ ์์ ์ ์ผ๋ก ์๋ํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.